package br.com.tarcilahelpdesk.managedBeans;

import br.com.tarcilahelpdesk.enums.EnumEstadoChamado;
import br.com.tarcilahelpdesk.enums.EnumObjetosPersistentes;
import br.com.tarcilahelpdesk.modelo.Modelo;
import br.com.tarcilahelpdesk.persistencia.Chamado;
import br.com.tarcilahelpdesk.util.HibernateUtil;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.hibernate.Session;

/**
 * MB da janela de visualização de chamados.
 * @author vinicius
 */
@ManagedBean(name = "dadosChamado")
@ViewScoped
public class DadosChamadoBean implements Serializable
{

    private Chamado chamado;
    private boolean mostrarPainelObs;
    private String descricao;
    private Session ss;
    private SimpleDateFormat fmtHora = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
    private char quebra = (char) 13;

    public DadosChamadoBean()
    {
        ss = HibernateUtil.getSessionFactory().openSession();
    }

    @PostConstruct
    public void inicializar()
    {
        if (FacesContext.getCurrentInstance().getExternalContext().getFlash().containsKey("idChamado"))
        {
            Long id = (Long) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("idChamado");
            setChamado((Chamado) Modelo.getInstancia().get(id, EnumObjetosPersistentes.Chamado, ss));
            
            if (getChamado().getEstado() != EnumEstadoChamado.Fechado)
            {
                mostrarPainelObs = true;
            }
        }
        else
        {
            String message = "Erro na requisição. Use os menus de navegação para prevenir este erro.";
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, message, null));
            setChamado(new Chamado());
            return;
        }
    }

    @PreDestroy
    public void encerrar()
    {
        ss.close();
    }
    
    public void limpar()
    {
        this.descricao = "";
    }

    public void inserirObservacao(ActionEvent evt)
    {
        getChamado().setHistorico("Alteração | " + fmtHora.format(new Date(Calendar.getInstance().getTimeInMillis())) + " : "
                + quebra
                + getDescricao()
                + quebra
                + quebra
                + getChamado().getHistorico());

        getChamado().setEstado(EnumEstadoChamado.EmAtendimento);

        Modelo.getInstancia().adicionar(getChamado(), ss);
        
        limpar();

        String message = "Observação inserida com sucesso!";
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, message, null));

    }

    public void encerrarChamado()
    {
        getChamado().setHistorico("Encerramento | " + fmtHora.format(new Date(Calendar.getInstance().getTimeInMillis())) + " : "
                + quebra
                + getDescricao()
                + quebra
                + quebra
                + getChamado().getHistorico());

        getChamado().setEstado(EnumEstadoChamado.Fechado);

        Modelo.getInstancia().adicionar(getChamado(), ss);
        
        limpar();
        
        mostrarPainelObs = false;

        String message = "Chamado encerrado com sucesso!";
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, message, null));
    }

    public Chamado getChamado()
    {
        return chamado;
    }

    public void setChamado(Chamado chamado)
    {
        this.chamado = chamado;
    }

    public String getDescricao()
    {
        return descricao;
    }

    public void setDescricao(String descricao)
    {
        this.descricao = descricao;
    }
    
    public boolean isMostrarPainelObs()
    {
        return mostrarPainelObs;
    }

    public void setMostrarPainelObs(boolean mostrarPainelObs)
    {
        this.mostrarPainelObs = mostrarPainelObs;
    }
    
    
}
